function U = crossover(X, V, CR, crossStrategy, Bound)

% 用于差分进化中的交叉操作
%
% INPUTS:
%   X            - [NP × Dim] 当前种群矩阵 (每行一个个体)
%   V            - [NP × Dim] 变异向量矩阵
%   CR           - 交叉概率 (Crossover Rate, 0~1)
%   crossStrategy- 交叉策略选择:
%                     1 二项式交叉 (Binomial Crossover)
%                     2 指数交叉   (Exponential Crossover)
%   Bound        - [2 × Dim] 每个维度的上下边界
%                  Bound(1,:) = 下界
%                  Bound(2,:) = 上界
%
% OUTPUTS:
%   U            - [NP × Dim] 交叉后的候选解矩阵


[NP, Dim] = size(X); % NP: 种群规模, Dim: 维度数
U = X;               % 初始化 U 为 X (默认不变), 便于后续覆盖

switch crossStrategy

    % 策略 1: Binomial Crossover (二项式交叉)
    % 对个体 X(i,:) 和 V(i,:) 按概率 CR 逐维进行交叉
    % 至少保证有一个维度发生交叉 (通过 jRand 强制)

    case 1
        for i = 1:NP
            jRand = floor(rand * Dim); % 强制交叉的随机维度 ∈ [0, Dim-1]
            for j = 1:Dim
                % 以概率 CR 从 V 继承，否则保留 X
                % 但保证 jRand 一定来自 V
                if rand < CR || j == jRand
                    U(i,j) = V(i,j);
                end
            end    
        end


    % 策略 2: Exponential Crossover (指数交叉)
    % 从某一维度 j 开始，连续按概率 CR 扩展交叉片段
    % 最多可交叉到整个向量

    case 2
        for i = 1:NP
            j = floor(rand * Dim); % 随机起始维度
            L = 0;                 % 已交叉长度
            U(i,j) = V(i,j);       % 起始位置一定交叉
            j = mod(j + 1, Dim);   % 循环取下一个维度
            L = L + 1;
            % 按概率 CR 扩展连续交叉片段
            while (rand < CR && L < Dim)
                U(i,j) = V(i,j);
                j = mod(j + 1, Dim);
                L = L + 1;
            end
        end

    otherwise
        error('没有指定有效的交叉策略，请重新设定crossStrategy的值'); 
end

% 边界约束处理 采用随机采样

for i = 1:NP
    % 找到该个体越界的维度索引 (true/false 向量)
    out_of_bounds = U(i,:) > Bound(2,:) | U(i,:) < Bound(1,:);
    if any(out_of_bounds)
        % 仅对越界的维度重新采样 (均匀分布)
        U(i, out_of_bounds) = Bound(1, out_of_bounds) + ...
            rand(1, sum(out_of_bounds)) .* ...
            (Bound(2, out_of_bounds) - Bound(1, out_of_bounds));
    end
end
end
